#include "ErreurCleAbsente.h"
#include "ErreurDictionnairePlein.h"

namespace tp3
{
	/*
	 * \brief Constructeur de la Classe ArbreAVLAdaptateur
	 * \param unsigned int taille_maximale
	 * \fn ArbreAVLAdaptateur(unsigned int taille_maximale)
	 */
	template<typename TypeCle, typename TypeValeur>
	ArbreAVLAdaptateur<TypeCle, TypeValeur>::ArbreAVLAdaptateur(unsigned int taille_maximale) :
	m_arbre(), m_taille_maximale(taille_maximale)
	{
	}
	/*
	 * \brief Méthode permettant d'afficher le contenue dont la clé est la même
	 * \param const TypeCle& cle
	 * \fn TypeValeur lire(const TypeCle& cle) const
	 * \return la valeur de l'element TypeValeur
	 */
	template<typename TypeCle, typename TypeValeur>
	TypeValeur ArbreAVLAdaptateur<TypeCle, TypeValeur>::lire(const TypeCle& cle) const
	{
		try
		{
				return m_arbre.valeur(cle);
		}
		catch(std::logic_error&)
		{
				throw ErreurCleAbsente("La clé n'existe pas dans le dictionnaire.");
		}
	}
	/*
	 * \brief Méthode permettant de savoir si la table n'est pas vide
	 * \fn ArbreAVLAdaptateur<TypeCle, TypeValeur>::nEstPasPlein() const
	 * \return true ou false
	 */
	template<typename TypeCle, typename TypeValeur>
	bool ArbreAVLAdaptateur<TypeCle, TypeValeur>::nEstPasPlein() const
	{
		return m_arbre.taille() < m_taille_maximale;
	}
	/*
	 * \brief Méthode permettant d'ajouter un élément
	 * \param const TypeCle& cle
	 * \param const TypeValeur& valeur
	 * \fn ArbreAVLAdaptateur<TypeCle, TypeValeur>::ajouter(const TypeCle& cle, const TypeValeur& valeur)
	 * \post throw ErreurDictionnairePlein = si la clé n'existe pas
	 */
	template<typename TypeCle, typename TypeValeur>
	void ArbreAVLAdaptateur<TypeCle, TypeValeur>::ajouter(const TypeCle& cle, const TypeValeur& valeur)
	{
		if (nEstPasPlein())
			{
				m_arbre.inserer(cle, valeur);
			}
		else
			{
				throw ErreurDictionnairePlein(
						"Aucun ajout ne peut être fait dans un dictionnaire déjà plein.");
			}
	}
	/*
	 * \brief Méthode permettant de lister tout les éléments
	 * \fn ArbreAVLAdaptateur<TypeCle, TypeValeur>::listerElements() const
	 * \return EnsembleCouples<TypeCle, TypeValeur>
	 */
	template<typename TypeCle, typename TypeValeur>
	EnsembleCouples<TypeCle, TypeValeur> ArbreAVLAdaptateur<TypeCle, TypeValeur>::listerElements() const
	{
		std::vector<std::pair<TypeCle, TypeValeur> > elementsV = m_arbre.lister();
		EnsembleCouples<TypeCle, TypeValeur> elements(elementsV.begin(), elementsV.end());
		return elements;
	}

}
